// easy

// 0, 1, ..., n-1,这n个数字排成一个圆圈，从数字0开始，每次从圆圈里删除第m个数字，现在给定整数n和m
// 要求：求出这个圆圈中剩下的最后一个数字

// 解题思路
// 模拟循环删除，需要进行n-1轮，每轮需要对节点进行m次访问操作，总体时间复杂度为O(nm)
// 刚开始为 0、1、2、3、4。
// 第一次从 0 开始数，数 3 个数，于是 2 出圈，变为 3、4、0、1。
// 第二次从 3 开始数，数 3 个数，于是 0 出圈，变为 1、3、4。
// 第三次从 1 开始数，数 3 个数，于是 4 出圈，变为 1、3。
// 第四次从 1 开始数，数 3 个数，于是 1 出圈，变为 3。
// 所以最终为3
// f(n, m)表示：n个数构成环没删除m个数后，最终胜利者的位置， 即等于n-1个数构成的环没删除m个数后最终胜利者的位置，向右移动m次
// 当数组右移超过数组容量的部分应该重新放到数组头部位置，所以公式应为:f(n, m) = (f(n-1, m) + m) % n, n为反过来向前推的时候，每一步剩余的数字个数

function lastRemaining(n, m) {
    let ans = 0
    for (let i = 2; i < n + 1; i++) {
        ans = (m + ans) % i
    }
    return ans
}

let n = 5, m = 3
console.log(lastRemaining(n, m))